All files / core/util OnlineMonitor.ts

76% Statements 19/25
54.55% Branches 6/11
71.43% Functions 5/7
73.91% Lines 17/23
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89                                12x 12x 12x                     12x 53x   12x 53x       53x           53x         53x                     53x                                 12x 31x 31x           12x 22x   12x  
/**
 * Copyright 2017 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
import { assert } from '@firebase/util';
import { EventEmitter } from './EventEmitter';
import { isMobileCordova } from '@firebase/util';
 
/**
 * Monitors online state (as reported by window.online/offline events).
 *
 * The expectation is that this could have many false positives (thinks we are online
 * when we're not), but no false negatives.  So we can safely use it to determine when
 * we definitely cannot reach the internet.
 *
 * @extends {EventEmitter}
 */
export class OnlineMonitor extends EventEmitter {
  private online_ = true;
 
  static getInstance() {
    return new OnlineMonitor();
  }
 
  constructor() {
    super(['online']);
 
    // We've had repeated complaints that Cordova apps can get stuck "offline", e.g.
    // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810
    // It would seem that the 'online' event does not always fire consistently. So we disable it
    // for Cordova.
    Eif (
      typeof window !== 'undefined' &&
      typeof window.addEventListener !== 'undefined' &&
      !isMobileCordova()
    ) {
      window.addEventListener(
        'online',
        () => {
          if (!this.online_) {
            this.online_ = true;
            this.trigger('online', true);
          }
        },
        false
      );
 
      window.addEventListener(
        'offline',
        () => {
          if (this.online_) {
            this.online_ = false;
            this.trigger('online', false);
          }
        },
        false
      );
    }
  }
 
  /**
   * @param {!string} eventType
   * @return {Array.<boolean>}
   */
  getInitialEvent(eventType: string): boolean[] {
    assert(eventType === 'online', 'Unknown event type: ' + eventType);
    return [this.online_];
  }
 
  /**
   * @return {boolean}
   */
  currentlyOnline(): boolean {
    return this.online_;
  }
}